/**
 * 并发控制类
 * 用于限制同时执行的异步任务数量，超出部分排队等待。
 */
export default class Concurrency {
    // 最大并发数
    private maxCount: number;
    // 当前正在执行的任务数
    private currentCount = 0;
    // 等待队列，存放待执行的异步任务
    private queue: Array<() => Promise<any>> = [];

    /**
     * 构造函数，传入最大并发数
     * @param max 最大并发数，必须大于0
     */
    constructor(max: number) {
        this.maxCount = max;
    }

    /**
     * 执行一个异步任务，如果超过最大并发数则排队等待
     * @param task 需要执行的异步任务函数，返回 Promise
     */
    execute(task: () => Promise<any>) {
        // 超过最大并发数，加入等待队列
        if (this.currentCount >= this.maxCount) {
            this.queue.push(task);
            return;
        }
        // 执行任务
        this.currentCount++;
        task().finally(() => {
            // 任务完成，取出下一个等待的任务执行
            this.currentCount--;
            const next = this.queue.shift();
            if (next) {
                this.execute(next);
            }
        });
    }
}